# -*- coding=utf-8
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client
import sys
import logging
import json
from medical_app.dao import tencentS3_dao

# 正常情况日志级别使用INFO，需要定位时可以修改为DEBUG，此时SDK会打印和服务端的通信信息
logging.basicConfig(level=logging.INFO, stream=sys.stdout)


def getPresignedUrl(key, method, params):

    # 获取固定密钥信息
    tencentS3_info = tencentS3_dao.getTencentS3()
    if tencentS3_info:
        region = tencentS3_info.region  # 获取存储地区
        bucket = tencentS3_info.bucket  # 获取存储桶名称
        secret_id = tencentS3_info.secret_id
        secret_key = tencentS3_info.secret_key
    else:
        region = ""
        bucket = ""
        secret_id = ""
        secret_key = ""
    scheme = "https"  # 指定使用 http/https 协议来访问 COS，默认为 https，可不填
    config = CosConfig(
        Region=region,
        SecretId=secret_id,
        SecretKey=secret_key,
        Scheme=scheme,
    )
    client = CosS3Client(config)
    # 生成上传URL，未限制请求头部和请求参数
    url = client.get_presigned_url(
        Method=method,
        Bucket=bucket,
        Key=key,
        Params=params,
        Expired=200,  # 120秒后过期，过期时间请根据自身场景定义
    )
    return url


"""
    response = requests.put(url=url, data=b'123')
    # 生成上传URL，同时限制存储类型和上传速度
    url = client.get_presigned_url(
        Method='PUT',
        Bucket='examplebucket-1250000000',
        Key='exampleobject',
        Headers={
            'x-cos-storage-class': 'STANDARD_IA',
            'x-cos-traffic-limit': '819200'  # 预签名URL本身是不包含请求头部的，但请求头部会算入签名，那么使用URL时就必须携带请求头部，并且请求头部的值必须是这里指定的值
        },
        Expired=300  # 300秒后过期，过期时间请根据自身场景定义
    )
    print(url)

    # 生成上传URL，只能上传指定的文件内容
    url = client.get_presigned_url(
        Method='PUT',
        Bucket='examplebucket-1250000000',
        Key='exampleobject',
        Headers={'Content-MD5': 'string'},  # 约定使用此URL上传对象的人必须携带MD5请求头部，并且请求头部的值必须是这里指定的值，这样就限定了文件的内容
        Expired=300  # 300秒后过期，过期时间请根据自身场景定义
    )
    print(url)

    # 生成上传URL，只能用于上传ACL
    url = client.get_presigned_url(
        Method='PUT',
        Bucket='examplebucket-1250000000',
        Key='exampleobject',
        Params={'acl': ''},  # 指定了请求参数，则URL中会携带此请求参数，并且请求参数会算入签名，不允许使用者修改请求参数的值
        Expired=120  # 120秒后过期，过期时间请根据自身场景定义
    )
    print(url)

    # 生成上传URL，请求域名不算入签名，签名后使用者需要修改请求域名时使用
    url = client.get_presigned_url(
        Method='PUT',
        Bucket='examplebucket-1250000000',
        Key='exampleobject',
        SignHost=False,  # 请求域名不算入签名，允许使用者修改请求域名，有一定安全风险
        Expired=120  # 120秒后过期，过期时间请根据自身场景定义
    )
    print(url)
"""
